\chapter{Structures de données}

Le tracker et chacun des pairs doivent connaître plus ou moins d'informations sur les pairs et les fichiers qu'ils partagent. Pour cela ils doivent disposer d'une structure de données leur permettant de stocker en mémoire ces informations. \\

Nous avons jugé que les informations dont doivent disposer les pairs et le tracker étaient les mêmes et donc que les pairs et le tracker disposeront de la même structure de données. La figure \ref{structure} illustre les structures de données. \\


La structure de données du tracker est la suivante :
\begin{itemize}
\item un dictionnaire $peers$ représentant l'ensemble des pairs connus et enregistrant pour chacun d'entre eux :
\begin{itemize}
\item son adresse IP (String)
\item son port d'écoute (String)
\item la liste des fichiers qu'ils partagent (List\textless File\textgreater)
\end{itemize}
\item un dictionnaire $files$ représentant l'ensemble des fichiers partagés par un ou plusieurs pairs connectés à ce tracker, enregistrant pour chaque fichier :
\begin{itemize}
\item son nom de fichier (String)
\item la taille totale du fichier (int)
\item la taille des pièces de ce fichier (int)
\item la liste des pairs qui partagent ce fichier (List\textless Peer\textgreater)\\
\end{itemize}
\end{itemize}

La structure de données d'un pair $P$ est la suivante :
\begin{itemize}
\item un dictionnaire $peers$ représentant l'ensemble des pairs auquel $P$ est connecté et enregistrant pour chacun d'entre eux :
\begin{itemize}
\item son adresse IP (char[15])
\item son port d'écoute (char[6])
\item la liste des fichiers qu'ils partagent (struct files *)
\end{itemize}
\item un dictionnaire $files$ représentant l'ensemble des fichiers partagés par $P$ disponible pour les autres pairs, enregistrant pour chaque fichier $F$ :
\begin{itemize}
\item son nom de fichier de $F$ (char *)
\item la taille totale de $F$ (int)
\item la taille des pièces de $F$ (int)
\item la liste des pairs qui partagent $F$ (struct peers *)
\item un buffermap, indiquant pour chaque pièce de $F$ si P s'il doit la télécharger ou s'il la possède et donc qu'il peut la partager (char * dans lequel le bit $i$ indique si $P$ dispose ou non de la pièce $i$)
\end{itemize}
\end{itemize}

\begin{center} 
\begin{figure}[!h]
   \caption{\label{structure} Structures de données}
   \includegraphics[width=14cm]{structures_donnees.png}
\end{figure}
\end{center} 

Nous avons choisi d'utiliser la signature MD5 sur le nom du fichier pour représenter sa clé. L'avantage de cette méthode est qu'elle permet d'obtenir une clé unique de longueur fixe pour chaque fichier. Elle est d'ailleurs plus facile à manipuler et à générer. Cependant, le fait de générer la clé par rapport au nom du fichier nous oblige à imposer au système que plusieurs fichiers ne peuvent pas avoir le même nom.
